翻訳と辞書
Words near each other
・ Normal, Kentucky
・ Normal, Ohio
・ Normal-exponential-gamma distribution
・ Normal-form game
・ Normal-gamma distribution
・ Normal-inverse Gaussian distribution
・ Normal-inverse-gamma distribution
・ Normal-inverse-Wishart distribution
・ Normal-Wishart distribution
・ Normal.dot
・ Normala Abdul Samad
・ Normalair
・ Normalat
・ Normalcy bias
・ Normalhöhennull
Normalisation by evaluation
・ Normality
・ Normality (behavior)
・ Normality (video game)
・ Normality test
・ Normalization
・ Normalization (Czechoslovakia)
・ Normalization (image processing)
・ Normalization (people with disabilities)
・ Normalization (sociology)
・ Normalization (statistics)
・ Normalization model
・ Normalization process model
・ Normalization process theory
・ Normalization property (abstract rewriting)


Dictionary Lists
翻訳と辞書 辞書検索 [ 開発暫定版 ]
スポンサード リンク

Normalisation by evaluation : ウィキペディア英語版
Normalisation by evaluation

In programming language semantics, normalisation by evaluation (NBE) is a style of obtaining the normal form of terms in the λ calculus by appealing to their denotational semantics. A term is first ''interpreted'' into a denotational model of the λ-term structure, and then a canonical (β-normal and η-long) representative is extracted by ''reifying'' the denotation. Such an essentially semantic approach differs from the more traditional syntactic description of normalisation as a reductions in a term rewrite system where β-reductions are allowed deep inside λ-terms.
NBE was first described for the simply typed lambda calculus. It has since been extended both to weaker type systems such as the untyped lambda calculus using a domain theoretic approach, and to richer type systems such as several variants of Martin-Löf type theory.
== Outline ==

Consider the simply typed lambda calculus, where types τ can be basic types (α), function types (→), or products (×), given by the following Backus–Naur Form grammar (→ associating to the right, as usual):
:(Types) τ ::= α | τ1 → τ2 | τ1 × τ2
These can be implemented as a datatype in the meta-language; for example, for Standard ML, we might use:

datatype ty = Basic of string
| Arrow of ty
* ty
| Prod of ty
* ty

Terms are defined at two levels. The lower ''syntactic'' level (sometimes called the ''dynamic'' level) is the representation that one intends to normalise.
:(Syntax Terms) ''s'',''t'',… ::= var ''x'' | lam (''x'', ''t'') | app (''s'', ''t'') | pair (''s'', ''t'') | fst ''t'' | snd ''t''
Here lam/app (resp. pair/fst,snd) are the intro/elim forms for → (resp. ×), and ''x'' are variables. These terms are intended to be implemented as a first-order in the meta-language:

datatype tm = var of string
| lam of string
* tm | app of tm
* tm
| pair of tm
* tm | fst of tm | snd of tm

The denotational semantics of (closed) terms in the meta-language interprets the constructs of the syntax in terms of features of the meta-language; thus, lam is interpreted as abstraction, app as application, etc. The semantic objects constructed are as follows:
:(Semantic Terms) ''S'',''T'',… ::= LAM (λ''x''. ''S'' ''x'') | PAIR (''S'', ''T'') | SYN ''t''
Note that there are no variables or elimination forms in the semantics; they are represented simply as syntax. These semantic objects are represented by the following datatype:

datatype sem = LAM of (sem -> sem)
| PAIR of sem
* sem
| SYN of tm

There are a pair of type-indexed functions that move back and forth between the syntactic and semantic layer. The first function, usually written ↑τ, ''reflects'' the term syntax into the semantics, while the second ''reifies'' the semantics as a syntactic term (written as ↓τ). Their definitions are mutually recursive as follows:

\begin
\uparrow_ t &= \mathbf\ t \\
\uparrow_ v &=
\mathbf (\lambda S.\ \uparrow_ (\mathbf\ (v, \downarrow^ S))) \\
\uparrow_ v &=
\mathbf (\uparrow_ (\mathbf\ v), \uparrow_ (\mathbf\ v)) \\()
\downarrow^ (\mathbf\ t) &= t \\
\downarrow^ (\mathbf\ S) &=
\mathbf\ (x, \downarrow^ (S\ (\uparrow_ (\mathbf\ x))))
\text x \text \\
\downarrow^ (\mathbf\ (S, T)) &=
\mathbf\ (\downarrow^ S, \downarrow^ T)
\end

These definitions are easily implemented in the meta-language:

(
* reflect : ty -> tm -> sem
*)
fun reflect (Arrow (a, b)) t =
LAM (fn S => reflect b (app t (reify a S)))
| reflect (Prod (a, b)) t =
PAIR (reflect a (fst t)) (reflect b (snd t))
| reflect (Basic _) t =
SYN t
(
* reify : ty -> sem -> tm
*)
and reify (Arrow (a, b)) (LAM S) =
let x = fresh_var () in
Lam (x, reify b (S (reflect a (var x))))
end
| reify (Prod (a, b)) (PAIR S T) =
Pair (reify a S, reify b T)
| reify (Basic _) (SYN t) = t

By induction on the structure of types, it follows that if the semantic object ''S'' denotes a well-typed term ''s'' of type τ, then reifying the object (i.e., ↓τ S) produces the β-normal η-long form of ''s''. All that remains is, therefore, to construct the initial semantic interpretation ''S'' from a syntactic term ''s''. This operation, written ∥''s''∥Γ, where Γ is a context of bindings, proceeds by induction solely on the term structure:

\begin
\| \mathbf\ x \|_\Gamma &= \Gamma(x) \\
\| \mathbf\ (x, s) \|_\Gamma &=
\mathbf\ (\lambda S.\ \| s \|_) \\
\| \mathbf\ (s, t) \|_\Gamma &=
S\ (\|t\|_\Gamma) \text \|s\|_\Gamma = \mathbf\ S \\
\| \mathbf\ (s, t) \|_\Gamma &=
\mathbf\ (\|s\|_\Gamma, \|t\|_\Gamma) \\
\| \mathbf\ s \|_\Gamma &=
S \text \|s\|_\Gamma = \mathbf\ (S, T) \\
\| \mathbf\ t \|_\Gamma &=
T \text \|t\|_\Gamma = \mathbf\ (S, T)
\end

In the implementation:

(
* meaning : ctx -> tm -> sem
*)
fun meaning G t =
case t of
var x => lookup G x
| lam (x, s) => LAM (fn S => meaning (add G (x, S)) s)
| app (s, t) => (case meaning G s of
LAM S => S (meaning G t))
| pair (s, t) => PAIR (meaning G s, meaning G t)
| fst s => (case meaning G s of
PAIR (S, T) => S)
| snd t => (case meaning G t of
PAIR (S, T) => T)

Note that there are many non-exhaustive cases; however, if applied to a ''closed'' well-typed term, none of these missing cases are ever encountered. The NBE operation on closed terms is then:

(
* nbe : ty -> tm -> tm
*)
fun nbe a t = reify a (meaning empty t)

As an example of its use, consider the syntactic term SKK defined below:

val K = lam ("x", lam ("y", var "x"))
val S = lam ("x", lam ("y", lam ("z", app (app (var "x", var "z"), app (var "y", var "z")))))
val SKK = app (app (S, K), K)

This is the well-known encoding of the identity function in combinatory logic. Normalising it at an identity type produces:

- nbe (Arrow (Basic "a", Basic "a")) SKK;
val it = lam ("v0",var "v0") : tm

The result is actually in η-long form, as can be easily seen by normalizing it at a different identity type:

- nbe (Arrow (Arrow (Basic "a", Basic "b"), Arrow (Basic "a", Basic "b"))) SKK;
val it = lam ("v1",lam ("v2",app (var "v1",var "v2"))) : tm


抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)
ウィキペディアで「Normalisation by evaluation」の詳細全文を読む



スポンサード リンク
翻訳と辞書 : 翻訳のためのインターネットリソース

Copyright(C) kotoba.ne.jp 1997-2016. All Rights Reserved.